#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>


/* 自定义捕获函数 */
void signal_fun(int signo) {
    if (signo == SIGINT) {
        printf("process %d end program, parent process %d\n", getpid(), getppid());
        exit(-1);
    }
}

int main() {
    int ret;

    // fork 之前的signal配置，会被子进程继承
    // 但如果子进程通过exec执行外部程序，则自定义捕获函数无效
    signal(SIGQUIT, SIG_IGN); // 忽略ctrl + \键触发的SIGQUIT信号
    signal(SIGTSTP, SIG_DFL); // 采用默认方式处理ctrl + Z键触发的SIGTSTP信号

    ret = fork();

    if (ret < 0) {
        perror("fork fail");
        exit (-1);
    }
    else if(ret == 0) {// 父进程
        printf("parent pid = %d\n", getpid());
        while(1) {
            sleep(1);    
        }
    }
    else {//子进程
        signal(SIGINT, signal_fun); // 捕捉ctrl + C键触发的SIGINT信号

        printf("child pid = %d\n", getpid());
        while (1) {
            sleep(1);
        }
    }
    return 0;
}

